Solo por curiosidad, quería hacer una función acotada con este enfoque particular:
var fn = function(a, b, c) { return a.call.apply(a.bind, arguments) } var boundFn = function(a, b, c) { fn.apply(null, arguments) } function unboundedFn() { console.log(this, arguments) } var boundedFn = boundFn(unboundedFn, x, y);Entonces, estoy tratando de entender qué hace exactamente a.call.apply (a.bind, arguments)?
Si tienes una función como esta:
function unboundedFn() { console.log(this, arguments) } Puede usar unboundedFn.call(thisObj, arg1, arg2) o unboundedFn.apply(thisObj, [arg1, arg2]) para ejecutarlo, pero cambiando lo que this significa dentro. Tanto la call como la apply hacen lo mismo, y la única diferencia es la forma de pasar los argumentos.
Debido a que call , apply y bind también son métodos, puede ejecutar, por ejemplo, unboundedFn.call.call.call.call.apply.apply.apply.apply() , pero no parece tener mucho sentido.
En su ejemplo return a.call.apply(a.bind, arguments) es igual a return a.bind.call(...arguments) , que es igual a a.bind(...arguments.slice(1)) , por lo que toda la función fn se puede simplificar a:
function fn(a,b,...args){ return a.bind(b, ...args); }